home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok20.lha / GraphicLib / GraphicLib_V1.0.DOK < prev    next >
Text File  |  1993-08-15  |  21KB  |  377 lines

  1.  
  2.  
  3.   ---------------------------------------------------------------------------
  4.  | Hinweis: In dieser Datei wird die Version 1.0 erklärt, die nicht          |
  5.  |          als Programm auf dieser Diskette vorliegt !                      |
  6.  |                                                                           |
  7.  |       Für die aktuelle Version sollte man die Datei GraphicLib_V1.2.txt |
  8.  |         noch zusätzlich zu dieser lesen. Die Version 1.2.2 liegt als      |
  9.  |       Source- und Objekt-Code vor.                                      |
  10.  | Datum:  30.04.1989                                                        |
  11.   ---------------------------------------------------------------------------
  12.  
  13.  
  14.             MODULA2 (M2AMIGA) GraphicLib V 1.0,25.Oktober 1988
  15.             --------------------------------------------------
  16.  
  17. (*---------------------------------------------------------------------------*)
  18. (*                                                                           *)
  19. (*  Copyright 1984 by Thomas E. Speer                                        *)
  20. (*  All rights reserved (PLOT V 3.3)                                         *)
  21. (*  Released to the Public Domain for Non-commercial use only                *)
  22. (*---------------------------------------------------------------------------*)
  23. (*                                                                           *)
  24. (*  Diese Software darf frei kopiert werden, solange dabei kein Gewinn   er- *)
  25. (*  zielt wird und der obige Copyright-Hinweis noch vorliegt.                *)
  26. (*  Anpassung an den AMIGA: Gary Struhlik, 14.10.1988, V 1.0                 *)
  27. (*  System: AMIGA 500, Kickstart 1.2 und M2Amiga von A.+L. Meier Vogt AG     *)
  28. (*                                       V 3.11d 05.05.88                    *)
  29. (*---------------------------------------------------------------------------*)
  30. (*                                                                           *)
  31. (* Die meisten in dieser Grafik-Bibliothek enthaltenen Unterprogramme wurden *)
  32. (* von Thomas E. Speer in der Public Domain Serie SIG/M  194 veröffentlicht. *)
  33. (* Diese wurden in TURBO PASCAL unter dem  Betriebssystem   CP/M   erstellt. *)
  34. (*                                                                           *)
  35. (* Die Anpassung und Erweiterung dieser Bibliothek wurde von   Gary Struhlik *)
  36. (* vorgenommen. Die Prozeduren wurden mit Hilfe des Compilers M2Amiga    von *)
  37. (* A.+L. AG    erstellt.  Das     ursprüngliche   Programm   war  in  erster *)
  38. (* Linie für den Drucker gedacht,d.h. die Darstellung auf dem Bildschirm war *)
  39. (* nicht vorgesehen. Die speziellen  Fähigkeiten   des  AMIGA   wurden   aus *)
  40. (* Kompatibilitätsgründen nicht ausgenutzt. Die Grafiken sollen   auch  hier *)
  41. (* für den späteren Ausdruck erstellt werden.                                *)
  42. (*                                                                           *)
  43. (* Die umgesetzte Version soll als  Version   1.0  bezeichnet   werden,  da  *)
  44. (* keine Garantie übernommen werden kann, daß sich nicht irgendwo ein Fehler *)
  45. (* eingeschlichen hat.                                                       *)
  46. (* Die Hardcopy Funktion könnte später noch optimiert werden. Man muß etwas  *)
  47. (* Geduld haben, ehe sich der Drucker rührt.   Die    geringe  Geschwindig-  *)
  48. (* keit liegt an der Prozedur ReadPixel des Betriebssytem in der Version 1.2 *)
  49. (*                                                                           *)
  50. (*---------------------------------------------------------------------------*)
  51.  
  52. Kurze Beschreibung:
  53. -------------------
  54.  
  55. Dieses Modul soll dazu dienen Funktionen  ( auch Wertepaare in Feldern )  auf
  56. dem Bildschirm darstellen zu können. Es wird dabei  nur eine zweifarbige Dar-
  57. stellung ausgenutzt. Es ist dann möglich  diese  auf  einem  epsonkompatiblen 
  58. 9-Nadel Drucker auszudrucken. Die hier integrierte  HardCopy-Prozedur  arbei-
  59. tet sehr langsam. Schuld an der geringen Geschwindigkeit ist die im Betriebs- 
  60. system enthaltene Prozedur "ReadPixel" in der Kickstart Version 1.2. Der Aus-
  61. druck dauert ca. 3 1/2 Minuten ( ca. 1 Minute ehe ReadPixel fertig ist,   und
  62. Rest ist die reine Druckzeit). Die Qualität ist aber für einen 9-Nadel Druck-
  63. er relativ gut. Der Ausdruck erfolgt so ähnlich wie der NLQ-Ausdruck, es wird
  64. jede Zeile zweimal gedruckt ( um 1/216 Inch verschoben). In vertikaler  Rich- 
  65. tung ergibt sich eine fast geschlossene Linie. Der Bildschirm wird auf    dem  
  66. Papier fast verzerrungsfrei ausgedruckt ( ein wenig mit der vertikalen   Ein-
  67. stellung des Monitors 'rumspielen).   
  68.  
  69.  
  70. Die meisten  Befehle ( werden später erklärt ) arbeiten nicht mit der  Punkt-
  71. auflösung der AMIGA Grafikmodi, sondern es werden  Koordinaten  in REAL  Dar-  
  72. stellung benutzt. Dies wurde so aus dem Original übernommen. Der Vorteil  der
  73. REAL Koordinaten liegt darin, daß man die Funktionen rechner- und   compiler-
  74. unabhängig darstellen kann. Einige Prozeduren sorgen für die Anpassung    von 
  75. der tatsächlichen Bildschirmauflösung an die REAL Koordinaten, z.B. gmove.
  76.  
  77. Es werden jetzt die Auflösungsarten kurz erklärt:
  78. -------------------------------------------------
  79.  
  80. Bildschirm des AMIGA:  Es werden 640x256 (PAL) Punkte zur Darstellung benutzt
  81.                        (rechnerabhängig). 
  82.                        Ursprung: Linke obere Ecke bei x=0 und y=0
  83.                                  mit x=0..639 und y=0..255
  84.                                  
  85. REAL-Koordinatenkreuz: Die original Software war für den Ausdruck auf einem
  86.                        Drucker gedacht. Der Autor Thomas E. Speer hatte ein 
  87.                        Quadrat  mit den folgenden Koordinaten definiert:
  88.                        
  89.                        Ursprung: Linke untere Ecke bei x=0.0000 und y=0.0000
  90.                                        ------
  91.                                  mit x=0.0000 ... 1.0000 und
  92.                                      y=0.0000 ... 1.0000
  93.                       
  94.                        Da der Bildschirm rechteckig ist und in der vertikalen
  95.                        Richtung eine geringere Punktdichte hat, gibt es  Ver-
  96.                        zerrungen gegenüber dem Original.
  97.                        
  98.                         
  99.                  0.0000,1.0000        1.0000,1.0000         
  100.                          ----------------
  101.                         | AMIGA          |
  102.                         | Bildschirm     |
  103.                         |                |
  104.                          ----------------  
  105.                  0.0000,0.0000         1.0000,0.0000
  106.                  
  107.                  Aus dieser Definition erkennt man, daß die Koordinaten be-
  108.                  liebige  reelle Werte zwischen 0.0000 und 1.0000  annehmen
  109.                  dürfen.           
  110.  
  111. Wichtig:
  112. --------
  113.  
  114. Bei  den REAL-Koordinaten muß man zwei Arten unterscheiden. Einmal die Bild-
  115. schirmkoordinaten, die später die Größe des Koordinatenkreuzes auf dem Bild-
  116. schirm festlegen und die REAL-Koordinaten der Wertepaare einer Funktion.
  117. Die REAL-Bildschirm-Koordinaten haben nichts mit den AMIGA-Koordinaten   des 
  118. 640x256 Punkte Bildschirmes zu tun, d.h. sie werden transformiert. 
  119.  
  120.  
  121. Darstellung von Funktionen:
  122. ---------------------------
  123.  
  124. Die wichtigsten Funktionen sind graph und Graph ( kein Eingabefehler, einmal
  125. mit großem G geschrieben).   Wobei  bei graph die Werte einzeln   gezeichnet
  126. werden und der (die) Programmierer(in)   erst   die  Grafik   mit    GraphOn
  127. einschalten  muß ( siehe Beispiel ), so braucht er (sie) bei der    Prozedur
  128. Graph nur diese aufrufen. Hierbei wird eine vollständige Funktion (z.B. sin) 
  129. als Parameter übergeben. Diese Methode scheitert natürlich, wenn man    z.B. 
  130. Meßwerte als Kurve darstellen möchte. Wer Lust hat, kann ja noch andere Var-
  131. ianten von Graph entwickeln, z.B. Übergabe eines OPEN ARRAY oder die     Be-
  132. schriftung der Achsen. 
  133. Bei Aufruf einer dieser Prozeduren wird ein vollständiges   Koordinatenkreuz
  134. gezeichnet. Die Skalierung erfolgt automatisch, aber derzeit nur     linear.
  135. Wer logarithmisch darstellen möchte (z.B. Amplitude eines komplexen Frequenz-
  136. gangs), übergibt einfach die Werte als 20*log10(ua/ue) für die y-Achse.
  137.  
  138.   
  139. Hinweis:
  140. --------
  141.  
  142. Bei dieser Grafik wird ein Fenster geöffnet, der (die) Programmierer(in)   
  143. braucht sich nicht mit dem Betriebssystem 'herumzuschlagen',dies erfolgt 
  144. automatisch sobald die Prozedur GraphOn aufgerufen wird. Alle    Befehle
  145. beziehen sich jetzt auf dieses Fenster. Das Fenster hat keinen    Rahmen
  146. und sieht im ersten Augenblick wie ein Screen aus. Es kann nach   Aufruf 
  147. mit MouseClick intuitiv am Schließ-Gadget geschlossen werden ( alles ist
  148. verloren), danach sollte noch GraphOff aufgerufen werden       (sauberes 
  149. Schließen des Fensters). Das Fenster kann ebenfalls intuitiv   in    den
  150. Hinter- bzw. Vordergrund geschaltet werden. Die Gadgets sind unsichtbar,
  151. die Zeichenfläche wird aber dafür voll ausgeschöpft    ( Wer klickt, der
  152. findet). Falls man zwischendurch mit  ReadString,  WriteString  oder  so    
  153. etwas ein- bzw. ausgeben möchte, sollte man    das  Grafikfenster   nach   
  154. 'hinten' klicken. Falls man nicht Graph benutzt, sondern andere Befehle,
  155. so sollte der Aufruf im eigenen Programm in etwa so aussehen:      
  156.             
  157.     GraphOn;
  158.     InitVector;
  159.     
  160.         ... Anweisungsfolge (z.B. graph) ....
  161.         
  162.     MouseClick;
  163.     GraphOff
  164.     
  165.                             
  166.     Falls man nur Graph benutzt, so sind keine weiteren Befehle
  167.     nötig ( HardCopy ist hier nicht möglich !)
  168.                             
  169.  
  170. Noch ein Hinweis zu der Textdarstellung:
  171.  
  172. In den Prozeduren gchar und gwrite wird ein eigener  Zeichensatz defi-
  173. niert. Warum ? Sicher die Zeichen sind nicht ganz perfekt  in    ihrer
  174. Darstellung (z.B. ungleichmäßige Zahlen), aber der Vorteil liegt darin, 
  175. daß die Zeichen ihre Größe ändern können, sogar ihren Winkel !
  176.             
  177.  
  178. Die Befehle:
  179. ------------            
  180.                             
  181.               Prozedur                            |   Kurze Beschreibung
  182. ------------------------------------------------------------------------------
  183.  
  184. PROCEDURE UnableToOpen( name : STRING );            hat nur interne  Bedeutung
  185.                                                     Der IMPORT wäre eigentlich
  186.                                                     unsinnig  
  187.  
  188. PROCEDURE ClrGraphic;                               Grafik löschen
  189.  
  190. PROCEDURE GraphOn;                                  Die Grafik einschalten
  191.                             (Bildschirm wird auto-
  192.                                                      matisch gelöscht)
  193.  
  194. PROCEDURE BlackPen;                                 Zeichenstift schwarz
  195.                                                     (löschen)
  196.  
  197. PROCEDURE WhitePen;                                 Zeichenstift weiß
  198.  
  199. PROCEDURE PlotPixel (x,y : INTEGER);                Punkt zeichnen
  200.                                                     (normaler AMIGA-Bild-
  201.                                                      schirm PAL)
  202.  
  203. PROCEDURE ClearPixel (x,y : INTEGER);               Punkt löschen 
  204.                                                     ( AMIGA-Bildschirm PAL)
  205.  
  206. PROCEDURE HardCopy ( lm : CARDINAL);                HardCopy 
  207.                                                     lm: linker Rand 0..26
  208.                                                      -> 13 HardCopy in der
  209.                                                         Mitte des Papiers
  210.  
  211. PROCEDURE DrawLine ( x1,y1,x2,y2 : INTEGER);        Linie zeichnen 
  212.                                                     ( AMIGA PAL )
  213.  
  214. PROCEDURE ClearLine ( x1,y1,x2,y2 : INTEGER);       Linie löschen
  215.                                                     ( AMIGA PAL)
  216.  
  217. PROCEDURE PrintText ( x,y : INTEGER;
  218.                     Zeichenkette : STRING );        Text in Grafik mit
  219.                                                     Standardzeichensatz !
  220.                                                     -------------------
  221.                                                     (AMIGA PAL)
  222.  
  223. PROCEDURE MouseClick;                               Warten bis Mausklick an 
  224.                                                     Gadget 
  225.  
  226. PROCEDURE GraphOff;                                 Grafikfenster schließen 
  227.                                                     Grafik Ende
  228.  
  229. PROCEDURE InitCharSize;                             Den neu definierten
  230.                                                     Zeichensatz initialisieren
  231.  
  232.  ********* Achtung Koordinaten in REAL !! **************
  233.  
  234. PROCEDURE gmove( x,y :REAL);                        Bewegt 'Malstift' absolut
  235.                                                     nach x,y  
  236.  
  237. PROCEDURE vector( x,y : REAL);                      Zieht eine Linie von der
  238.                                                     aktuellen Stiftposition
  239.                                                     zur Position x,y 
  240.                                                     (absolut) 
  241.  
  242. PROCEDURE ChSet ( xsize,ysize, theta : REAL);       Legt die Größe und den
  243.                                                     Winkel des neu definierten
  244.                                                     Zeichensatzes fest:
  245.                                                     xsize: x-Größe
  246.                                                     ysize: y-Größe
  247.                                                     theta: Winkel (Grad !) 
  248.                                                     REAL-Bereich beachten !
  249.  
  250. PROCEDURE gchar( cx,cy : REAL; charin : CHAR);      Ein Grafikzeichen zeichnen
  251.                                                     (neu definiert)
  252.                                                     cx,cy: Koordinaten links
  253.                                                            unten vom Zeichen
  254.                                                     charin: Das Zeichen
  255.                                                     
  256. PROCEDURE gwrite(x,y : REAL; chars : textline);     Wie gchar, aber für 
  257.                                                     Zeichenkette (max. 80
  258.                                                     Zeichen) 
  259.                                                     
  260.  
  261. PROCEDURE Print( x,y : INTEGER; satz : textline);   Wie gwrite, aber die
  262.                                                     Koordinaten sind jetzt
  263.                                                     wieder auf den AMIGA 
  264.                                                     Bildschirm bezogen (PAL) 
  265.  
  266. PROCEDURE rx( sxi : REAL ) : REAL;                  Umwandlung von
  267.                                                     Bildschirmkoordinate => 
  268.                                                     Realkoordinate
  269.                                                     sxi: Bildschirmkoordinate
  270.  
  271. PROCEDURE ry( syi : REAL ) : REAL;                  Wie rx, aber für y-Achse
  272.  
  273. PROCEDURE sx( rxi : REAL ) : REAL;                  Gegenteil von rx
  274.  
  275. PROCEDURE sy( ryi : REAL ) : REAL;                  Gegenteil von ry
  276.  
  277. PROCEDURE swindo( sxlti,sxrti,
  278.                        syboti,sytopi : REAL );      Bildschirmfenstergröße
  279.                                                     festlegen ( ungleich
  280.                                                     AMIGA Fenster ! )
  281.                                                     sxlti: linke Ecke
  282.                                                     sxrti: rechte Ecke
  283.                                                     syboti: untere Ecke
  284.                                                     sytopi: obere Ecke
  285.  
  286. PROCEDURE rwindo( xmini,xmaxi,ymini,ymaxi : REAL);  Real-Fenster-Größe
  287.                                                     xmini: linke Ecke
  288.                                                     xmaxi: rechte Ecke
  289.                                                     ymini: untere Ecke
  290.                                                     ymaxi: obere Ecke
  291.   
  292.  
  293. PROCEDURE segmnt (x1,y1,x2,y2 : REAL);              Eine Linie von (x1,y1)
  294.                                                     nach (x2,y2) ziehen
  295.  
  296. PROCEDURE InitVector;                               Initialisierung der
  297.                                                     Vektorgrafik (stets 
  298.                                                     aufrufen !)
  299.                                                     InitCharSize braucht
  300.                                                     dann nicht benutzt 
  301.                                                     werden !
  302.     
  303. PROCEDURE point (x,y : REAL);                       Punkt setzen 
  304.                                                     x,y absolut
  305.  
  306. PROCEDURE posang (angle : REAL) : REAL;             Winkel innerhalb 0..360
  307.                                                     Grad, falls größer oder
  308.                                                     kleiner
  309.  
  310. PROCEDURE ticend (rmin,rmax,dr : REAL;              Berechnung der Größen
  311.                        VAR pr1,pr2 : REAL);         des Achsenendes.
  312.                                                     
  313.  
  314. PROCEDURE dxdy( x1,x2 : REAL; nx : INTEGER;         Achsen formatieren.
  315.               VAR lblnum,lbldec : INTEGER) : REAL;  (interne Bedeutung) 
  316.  
  317. PROCEDURE axis( r1,r2,dri,                          Koordinatenkreuz zeich-
  318.           sx1,sy1,sx2,sy2,ticlen,ticang : REAL;     nen. 
  319.           lblnum,lbldec : INTEGER; lblang : REAL);
  320.                                                 r1: Realwert (Achsenstart)
  321.                                                     r2: Realwert (Achsenende)
  322.                                                     dri: Realwertabstand der
  323.                                                          Intervalle
  324.                                                     sx1,sx2,sy1,sy2:
  325.                                                        Bildschirmkoordinaten
  326.                                                        des Achsenkreuzes
  327.                                                     ticlen: Länge der Mar-
  328.                                                             kierungsstriche
  329.                                                     ticang: Winkel zur Horz.
  330.                                                             (für ticlen)
  331.                                                     lblnum: Anzahl der Zeichen
  332.                                                             in der Zeichenkette 
  333.                                                     lbldec: Anzahl der Nach-
  334.                                                             kommastellen
  335.                                                     lblang: Winkel in Grad
  336.                                                     
  337.  
  338. PROCEDURE graph( xmini,xmaxi : REAL;
  339.                 nx : INTEGER; ymini,ymaxi : REAL; 
  340.             ny : INTEGER; sxl,sxr,syb,syt : REAL); 
  341.                                                     Graphen in Koordinaten-
  342.                                                         kreuz zeichnen.
  343.                                                         xmin,xmax: Realwerte
  344.                                                                    für x-Achse
  345.                                                         nx: Intervalle auf der
  346.                                                             x-Achse
  347.                                                         ymin,ymax: Realwerte
  348.                                                                    für y-Achse
  349.                                                         ny: Intervalle auf der
  350.                                                             y-Achse
  351.                                                         sxl,sxr,syb,syt:
  352.                                                           Bildschirmkoordinaten
  353.                                                           des Achsenkreuzes
  354.                                                           ( tatsächliche Größe )
  355.                                                           auf dem Bildschirm
  356.  
  357. PROCEDURE Graph ( f : fkt ; Schritt : REAL; 
  358.          xanf,xende : REAL; xAbschnitte : INTEGER;   Wie graph, kann 
  359.              yanf,yende : REAL; yAbschnitte : INTEGER;   aber ganz alleine
  360.              xlanf, xlende, ylanf, ylende : REAL);       aufgerufen werden
  361.                                                              Übergabe einer 
  362.                                                              REAL-Funktion
  363.                                                              fkt 
  364. Noch ein Tip:
  365. -------------
  366.  
  367. Auf der PUBLIC DOMAIN Diskette 'FISH 58' befindet sich ein ähnliches
  368. Programm (EGRAPH). Hier können die Wertepaare auch in  logarithmisch
  369. eingeteilten Achsen dargestellt werden. Ein Ausdruck ist   ebenfalls 
  370. möglich. Allerdings kann man diese Software nicht in   eigene   Pro-
  371. gramme einbinden. Die Wertepaare müssen in einer     ASCII-Textdatei
  372. angelegt werden, diese werden dann vom Programm eingelesen. 
  373.  
  374. Viel Spaß !
  375.  
  376. -Gary-
  377.